public class Alfabeto {

	private final String[] simbolosValidos;
	private final int cardinalidade;
	public final String OUTROS = "Outros";
	public final String VAZIO = "Vazio";

	// O contrutor desta classe define sua cardinalidade e seta os seus simbolos
	// validos
	public Alfabeto(int cardinalidade, String[] simbolosValidos) {

		this.cardinalidade = cardinalidade;

		this.simbolosValidos = new String[cardinalidade];

		this.setSimbolosValidos(simbolosValidos);

	}

	// Esse metodo e responsavel por prencher o vetor de simbolos validos do
	// alfabeto
	private void setSimbolosValidos(String[] simbolosValidos) {

		for (int i = 0; i < simbolosValidos.length; i++)
			this.simbolosValidos[i] = simbolosValidos[i];

	}

	// Esse metodo devolve a posicao do simbolo no vetor de simbolosValidos
	// Caso o simbolo seja outros, e devolvido o valor da cardinalidade
	public int buscarPosicao(String simbolo) {

		if (simbolo.equals(VAZIO))
			return cardinalidade + 1;

		for (int i = 0; i < cardinalidade; i++)
			if (simbolo.equals(simbolosValidos[i]))
				return i;

		// Caso o simbolo nao esteja presente no alfabeto retornamos outros, ou
		// seja, cardinalidade
		return cardinalidade;
	}

	// Metodo responsavel por devolver a cardinalidade do alfabeto
	public int getCardinalidade() {

		return cardinalidade;

	}

	// Devolve o simbolo associado a posicaoSimbolo
	public String getSimbolo(int posicaoSimbolo) {

		if (posicaoSimbolo < cardinalidade)
			return simbolosValidos[posicaoSimbolo];
		else if (posicaoSimbolo == cardinalidade)
			return OUTROS;
		else
			return VAZIO;

	}

	// Esse metodo informa se o simbolo esta presente no alfabeto
	public boolean verificarSimbolo(String simbolo) {

		for (int i = 0; i < cardinalidade; i++)
			if (simbolo.equals(simbolosValidos[i]))
				return true;

		return false;

	}

	// Esse metodo informa se o simbolo e subcadeia de algum simbolo presente no
	// alfabeto
	public boolean verificarSubcadeia(String subCadeia) {

		for (int i = 0; i < cardinalidade; i++)
			if (simbolosValidos[i].indexOf(subCadeia) != -1)
				return true;

		return false;

	}

}
